package com.sprouting.personal.annotations;

import com.sprouting.personal.annotations.impl.CheckLengthValidator;
import com.sprouting.personal.model.common.jsr.AddGroup;
import com.sprouting.personal.model.common.jsr.UpdGroup;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * 字段长度检查，数据库标准
 * 触发的条件，不传分组的话，默认对 新增和修改触发
 *
 * 注解测试，
 *      当 controller中为 @Validated(AddGroup.class)  ，model中为 groups = {AddGroup.class} ，进入注解
 *      当 controller中为 @Validated(UpdGroup.class)  ，model中为 groups = {AddGroup.class} ，不进入
 *      当 controller中为 @Validated  ，model中为 groups = {AddGroup.class} ，不进入
 *      当 controller中为 @Validated  ，model中为 group = {}  ，进入注解，其实走的是默认组
 *      当 controller中为 @Validated(UpdGroup.class, AddGroup.class)  ，model中为 groups = {AddGroup.class}  ，进入注解
 *      当 controller中为 @Validated(UpdGroup.class, AddGroup.class)  ，model中为 groups = {}  ，进入注解,因为新增和修改都继承自默认注解
 *      当 controller中为 @Validated(AddGroup.class)  ，model中为 groups = {}  ，进入注解,因为新增和修改都继承自默认注解
 *
 *  根据上面的结果，新增和修改的时候只要不为空，都可以直接使用注解即可，不需要写组信息
 *
 * @author ：LX（长沙麓谷）
 * @date 创建时间： 2022/7/28 0:17
 */
@Retention(RUNTIME)
@Documented
@Target({METHOD, FIELD, ANNOTATION_TYPE})
@Constraint(validatedBy = CheckLengthValidator.class)
public @interface CheckLength {

    /**
     * 校验错误时候的提示信息
     * @return
     */
    String message() default "参数长度长度超过限定范围";

    /**
     * 分组，有时候只想让该注解在请求或修改的时候触发成功
     * 对应 AddGroup 和 UpdGroup 接口
     * @return
     */
    Class<?>[] groups() default {

    };

    Class<? extends Payload>[] payload() default { };

    /**
     * 字段的默认最小值
     * @return
     */
    int min() default 0;

    /**
     * 字段的默认最大值
     * @return
     */
    int max() default Integer.MAX_VALUE;
}
